﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using service_desk_blred.Models;
using service_desk_blred.Utils;

namespace service_desk_blred.Controllers
{

    [HandleError]
    public class UsuarioController : Controller
    {

        public IFormsAuthenticationService FormsService { get; set; }
        public UsuarioService UsuarioService { get; set; }
        public ComumService ComumService { get; set; }
        public EmpresaService EmpresaService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (FormsService == null) { FormsService = new ControleDeAcessoService(); }
            if (UsuarioService == null) { UsuarioService = new UsuarioService(); }
            if (ComumService == null) { ComumService = new ComumService(); }
            EmpresaService = new EmpresaService();

            base.Initialize(requestContext);
        }

        // **************************************
        // URL: /Usuario/EsqueciSenha
        // **************************************

        public ActionResult EsqueciSenha()
        {
            return View();
        }

        [HttpPost]
        public ActionResult EsqueciSenha(EsqueciSenhaModel model)
        {
            if (ModelState.IsValid)
            {
                return RedirectToAction("Index", "Inicio");
            }
            else
            {

                ModelState.AddModelError("", "Senha não coincidem.");

                return View();
            }


        }


        // **************************************
        // URL: /Usuario/Registrar
        // **************************************

        public ActionResult Registrar()
        {

            ModelState.Clear();


            UsuarioModel model = new UsuarioModel();

            ResponseInfo responseEstados = ComumService.RecuperarTodosEstados();

            if (responseEstados.isSuccess())
            {

                model.ListaEstados = new List<SelectListItem>();

                foreach (LocalidadeModel item in (List<LocalidadeModel>)responseEstados.objResponse)
                {
                    model.ListaEstados.Add(new SelectListItem { Text = item.SiglaEstado + " - " + item.NomeEstado, Value = item.IdEstado.ToString() });
                }

            }

            model.Localidade = new LocalidadeModel();

            return View(model);
        }

        [HttpPost]
        public ActionResult Registrar(UsuarioModel model)
        {
            if (ModelState.IsValid)
            {
                Session["usuario"] = model;

                if (model.Grupo.Equals("Cliente"))
                {
                    return RedirectToAction("RegistrarCliente", "Usuario");
                }
                else if (model.Grupo.Equals("Analista"))
                {
                    return RedirectToAction("RegistrarAnalista", "Usuario");
                }
                else
                {
                    ModelState.AddModelError("", "Não foi possível concluir sua operação.");
                    return View();
                }
            }
            else
            {
                ModelState.AddModelError("", "Não foi possível concluir sua operação.");
                return View();
            }


        }


        // **************************************
        // URL: /Usuario/RegistrarCliente
        // **************************************
        public ActionResult RegistrarCliente()
        {

            UsuarioModel usuario = (UsuarioModel)Session["usuario"];
            ClienteModel model = new ClienteModel();
            model.Usuario = usuario;

            ResponseInfo response = EmpresaService.recuperarTodos();
            List<EmpresaModel> empresa = (List<EmpresaModel>)response.objResponse;

            model.ListaEmpresas = new List<SelectListItem>();

            foreach (EmpresaModel item in (List<EmpresaModel>)response.objResponse)
            {
                model.ListaEmpresas.Add(new SelectListItem { Text = item.NomeFantasia, Value = item.IdEmpresa.ToString() });
            }

            return View(model);
        }

        [HttpPost]
        public ActionResult RegistrarCliente(ClienteModel model)
        {

            UsuarioModel usuario = (UsuarioModel)Session["usuario"];
            usuario.GrupoUsuario = new GrupoModel();

            if (model.ClienteGestor)
            {
                usuario.GrupoUsuario.IdGrupo = 4;
            }
            else
                usuario.GrupoUsuario.IdGrupo = 5;
            usuario.Senha = CriptografaString.encryptString(Constantes.SENHA_PADRAO);

            model.Usuario = usuario;
            ResponseInfo response = UsuarioService.CriarUsuarioCliente(model);

            if (response.isSuccess())
            {
                return RedirectToAction("Sucesso", "Usuario");

            }
            else
            {

                ModelState.AddModelError("", "Erro ao cadastrar o fornecedor:  " + response.descricao);
            }

            return View();


            return RedirectToAction("Sucesso", "Usuario");
        }

        // **************************************
        // URL: /Usuario/RegistrarAnalista
        // **************************************
        public ActionResult RegistrarAnalista()
        {

            UsuarioModel usuario = (UsuarioModel)Session["usuario"];
            AnalistaModel model = new AnalistaModel();
            model.Usuario = usuario;
            model.Usuario.GrupoUsuario = new GrupoModel();
            model.ListaCargos = new List<SelectListItem>();

            ResponseInfo response = UsuarioService.RecuperarGrupos();

            foreach (GrupoModel item in (List<GrupoModel>)response.objResponse)
            {
                if (item.IdRegra == 4 || item.IdRegra == 1)
                {
                    model.ListaCargos.Add(new SelectListItem { Text = item.NomeGrupo, Value = item.IdRegra.ToString() });
                }
            }

            Session["modelViewer"] = model;

            return View(model);

        }

        [HttpPost]
        public ActionResult RegistrarAnalista(AnalistaModel model)
        {

            UsuarioModel usuario = (UsuarioModel)Session["usuario"];
            usuario.GrupoUsuario = model.Usuario.GrupoUsuario;
            usuario.Senha = CriptografaString.encryptString(Constantes.SENHA_PADRAO);

            ResponseInfo response = UsuarioService.CriarUsuario(usuario);

            if (response.isSuccess())
            {
                return RedirectToAction("Sucesso", "Usuario");

            }
            else
            {

                ModelState.AddModelError("", "Erro ao cadastrar o fornecedor:  " + response.descricao);
            }

            return View();
        }


        // **************************************
        // URL: /Usuario/MudarSenha
        // **************************************

        [Authorize]
        public ActionResult MudarSenha()
        {
            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult MudarSenha(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                UsuarioModel user = (UsuarioModel)Session["USUARIO_LOGADO"];


                if (UsuarioService.MudarSenha(user, model.SenhaAntiga, model.NovaSenha))
                {
                    return RedirectToAction("MudarSenhaSucesso");
                }
                else
                {
                    ModelState.AddModelError("", "A sua senha atual pode estar incorreta ou sua nova senha não é valida.");
                }
            }

            return View(model);
        }


        public ActionResult GerenciarUsuario()
        {

            return View();
        }


        // **************************************
        // URL: /Usuario/MudarSenhaSucesso
        // **************************************

        public ActionResult MudarSenhaSucesso()
        {
            return View();
        }

        public ActionResult Sucesso()
        {
            ViewData["TitleMessage"] = "Operação realizada com Sucesso";
            return View();
        }


        public ActionResult Pesquisar()
        {
            ListaUsuarioModel model = new ListaUsuarioModel(new List<UsuarioModel>());
            model.ListaGrupos = new List<SelectListItem>();
            ResponseInfo response = UsuarioService.RecuperarGrupos();

            foreach (GrupoModel item in (List<GrupoModel>)response.objResponse)
            {
                model.ListaGrupos.Add(new SelectListItem { Text = item.NomeGrupo, Value = item.IdGrupo.ToString() });
            }
            return View(model);
        }

        [HttpPost]
        public ActionResult Pesquisar(ListaUsuarioModel model)
        {

            Session["ID_PESQUISA"] = model.idGrupoPesquisa;

            return RedirectToAction("Gerenciar");
        }

        public ActionResult Gerenciar()
        {
            ResponseInfo response = UsuarioService.RecuperarUsuarios(Session["ID_PESQUISA"]);
            List<UsuarioModel> responseList = (List<UsuarioModel>)response.objResponse;
            ListaUsuarioModel model = new ListaUsuarioModel(responseList);
            model.ListaGrupos = new List<SelectListItem>();
            response = UsuarioService.RecuperarGrupos();

            foreach (GrupoModel item in (List<GrupoModel>)response.objResponse)
            {
                model.ListaGrupos.Add(new SelectListItem { Text = item.NomeGrupo, Value = item.IdRegra.ToString() });
            }

            List<UsuarioModel> usuarios = new List<UsuarioModel>();
            foreach (UsuarioModel item in responseList)
            {
                foreach (GrupoModel grupo in (List<GrupoModel>)response.objResponse)
                {
                    if (grupo.IdGrupo == item.GrupoUsuario.IdGrupo)
                    {
                        item.Grupo = grupo.NomeGrupo;
                    }
                }
                usuarios.Add(item);
                model.usuarios = usuarios;
            }

            return View(model);
        }

    }
}
